package com.yky.utils;

import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SM4;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * 业务聚合
 *
 * @version [V2.0]
 * @package com.sm4;
 * @description:[用一句话描述该文件做什么]
 * @author: [zhuben]
 * @date: [2024-02-23 11:39]
 * @copyright: 2024 echovin.com
 */
public final class SmUtils extends SmUtil {
    /**
     * CBC模式 不满block长度时使用0填充
     * @param key 密钥，支持密钥长度：128位
     * @param salt 盐
     * @return
     */
    public static SM4 sm4CBC(byte [] key, byte [] salt){
        return new SM4(Mode.CBC, Padding.ZeroPadding, key, salt);
    }

    /**
     * EBC模式 不满block长度时使用0填充
     * @param key 密钥，支持密钥长度：128位
     * @return
     */
    public static SM4 sm4EBC(byte [] key){
        return new SM4(Mode.ECB, Padding.ZeroPadding, key);
    }

    /**
     *
     * @param mode 加密算法模式
     * @param padding 补码方式
     * @param key 密钥，支持密钥长度：128位
     * @param salt 盐
     * @return
     */
    public static SM4 sm4(Mode mode, Padding padding, byte [] key, byte [] salt){
        return new SM4(mode, padding, key, salt);
    }

    /**
     * ecb模式加密
     * @param key
     * @param data
     * @return
     */
    public static String encryptEcb(String key, String data){
        SM4 sm4 = sm4EBC(key.getBytes(StandardCharsets.UTF_8));
        return sm4.encryptHex(data);
    }

    /**
     * ecb模式解密
     * @param key
     * @param data
     * @return
     */
    public static String decryptEcb(String key, String data){
        SM4 sm4 = sm4EBC(key.getBytes(StandardCharsets.UTF_8));
        return sm4.decryptStr(data);
    }

    /**
     * cbc模式加密
     * @param key
     * @param salt
     * @param data
     * @return
     */
    public static String encryptCbc(String key, String salt, String data){
        SM4 sm4 = sm4CBC(key.getBytes(StandardCharsets.UTF_8), salt.getBytes(StandardCharsets.UTF_8));
        return sm4.encryptHex(data);
    }

    /**
     * cbc模式解密
     * @param key
     * @param salt
     * @param data
     * @return
     */
    public static String decryptCbc(String key, String salt, String data){
        SM4 sm4 = sm4CBC(key.getBytes(StandardCharsets.UTF_8), salt.getBytes(StandardCharsets.UTF_8));
        return sm4.encryptHex(data);
    }

    public static void main(String[] args) {
        String eyJ0eXAiOiJKV1Qi = encryptEcb("eyJ0eXAiOiJKV1Qi", "name=sa&pwd=123456");
        System.out.println(eyJ0eXAiOiJKV1Qi);
    }

}
